﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Lifetime;
using System.Web;
using System.Web.ModelBinding;
using System.Web.Mvc;

namespace WebMVC.Controllers
{
    public class UpFileController : Controller
    {
        // GET: UpFile
        public ActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// 接收存粹AJAX上传文件的方法
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public JsonResult UpFiles()
        {
            //Request是网站项目中的重要对象“请求对象”，可能使用这个对象得到用户浏览器上的所有信息
            //从请求对象中获取上传的文件对象
            //这里字符串"upfile",这个值【必须】和AJAX中包装文件时用的名称一模一样，formData.append("upfile", myfile); 
            HttpPostedFileBase fileBase = Request.Files["upfile"];
            //保存文件夹的【物理路径】
            //获取到的是UpFiles这个文件夹在你当前电脑中的位置，如：E:\002课程案例\022专业基础5 MVC\文件上传\WebMVC\UpFiles\
            string filesPath = Server.MapPath("/UpFiles/"); //注意前后都要有斜线

            //SaveAs()是保存文件，如果出错，整个项目就崩溃了，所以加个异常处理
            //如果保存文件“正确执行”或“出错了”好分别给出不同数值，我这里使用200表示成功，500表示失败
            try
            {
                //SaveAs()保存文件，参数是用于保存上传文件的【物理路径和上传文件的名称.扩展名]
                //文件名称是由两部分组成的【文件名.扩展名】,如："Ajax上传视频.mp4"，Ajax上传视频是文件名mp4是扩展名，中间使用点间隔开
                fileBase.SaveAs(filesPath + fileBase.FileName);
                //这个信息是返回到网页上的，路径应该是虚拟路径
                //我们用200表示成功,FileName保存了上传文件名称，FilePath保存了文件保存在网站的哪个文件夹中
                //new用于实例化对象，这里没有指定创建哪个类的使用，这个使用的方式叫创建一个匿名类对象，通用用于临时创建对象
                return Json(new { Code = "200",FileName = fileBase.FileName, FilePath = $"/UpFiles/{fileBase.FileName}" });
            }
            catch (Exception)
            {
                //我们用500表示失败,由于失败FilePath就不用保存信息了
                return Json(new { Code = "500", FileName = fileBase.FileName, FilePath = "" });
            }
        }


        /// <summary>
        /// 接收存粹AJAX上传文件的方法
        /// 根据参数获取上传的文件数据
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public JsonResult UpFilesValue(HttpPostedFileBase upfile)
        {
            HttpPostedFileBase fileBase = upfile;
            string filesPath = Server.MapPath("/UpFiles/");
            try
            {
                fileBase.SaveAs(filesPath + fileBase.FileName); //SaveAs()是保存文件，如果出错，整个项目就崩溃了，所以加个异常处理
                return Json(new { Code = "200", FileName = fileBase.FileName, FilePath = $"/UpFiles/{fileBase.FileName}" });
            }
            catch (Exception)
            {
                return Json(new { Code = "500", FileName = fileBase.FileName, FilePath = "" });
            }
        }


        /// <summary>
        /// 接收存粹AJAX上传文件的方法
        /// 无注释的
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public JsonResult UpFilesTemp()
        {
            HttpPostedFileBase fileBase = Request.Files["upfile"];
            string filesPath = Server.MapPath("/UpFiles/"); 
            try
            {
                fileBase.SaveAs(filesPath + fileBase.FileName); //SaveAs()是保存文件，如果出错，整个项目就崩溃了，所以加个异常处理
                return Json(new { Code = "200", FileName = fileBase.FileName, FilePath = $"/UpFiles/{fileBase.FileName}" });
            }
            catch (Exception)
            {
                return Json(new { Code = "500", FileName = fileBase.FileName, FilePath = "" });
            }
        }
    }
}